// 3. 设计一个 Koa 中间件链，实现以下功能：

// 1. 请求日志中间件：记录所有请求的基本信息，包括 URL、方法、时间戳。
// 2. 数据格式化中间件：将请求体中的 JSON 数据转换为大写键格式（例如，将 `name` 改为 `NAME`）。
// 3. 路由处理中间件：根据请求路径 `/api/data` 返回处理后的数据。

// 要求：

// 1. 请求日志的格式为 `[REQUEST] [时间] [方法] [URL]`。
// 2. 数据格式化中间件仅对 `POST` 请求生效。
// 3. `/api/data` 返回格式化的 JSON 数据。

// 导入依赖包
import koa from "koa";
import Router from "koa-router";
import bodyparser from "koa-bodyparser";

// 创建 koa 实例
const app = new koa();
// 创建 router 实例
const router = new Router();

// 端口号
const port = 9000;

// 监听端口
app.listen(port);

// 创建日志函数（返回日志信息）
function log(method, url) {
  // 创建时间实例
  const date = new Date();

  // 格式化 当前时间
  const nowTime = `${date.getFullYear()}-${
    date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1
  }-${
    date.getDate() < 10 ? `0${date.getDate()}` : date.getDate()
  } ${date.toLocaleTimeString()}`;

  // 返回 日志信息
  return `[REQUEST] ${nowTime} ${method} ${url}`;
}

// 解析 请求体
app.use(bodyparser());

// 处理 POST 请求（使用 api/data）
router.post("/api/data", async (ctx, next) => {
  // 获取请求的 JSON
  const jsonContent = ctx.request.body;

  // 创建一个新的 JSON 对象
  const updateJson = {};

  // 遍历 JSON 把小写键修改成大写
  for (const key in jsonContent) {
    // 给新对象赋值
    updateJson[key.toUpperCase()] = jsonContent[key];
  }

  // 把新 JSON 对象返回给页面
  ctx.response.body = updateJson;

  // 使用日志函数输出日志
  console.log(log(ctx.method, ctx.url));
});

// 使用中间件 处理 URL
app.use(router.routes());

// 输出当前监听的地址
console.log(`当前监听的地址：http://localhost:${port}`);
